package generic.demo;

/**
 * 泛型类,泛型接口,泛型方法的使用及特性
 *
 * @author
 */
public class MainT {
    public static void main(String[] args) {

        // 一.泛型类demo
        GenericClass genericClass = new GenericClass("a");
        String a = (String) genericClass.getT();
        System.out.println(a);

        // 如果不传类型实参，可以使用任意的类型
        GenericClass genericClass1 = new GenericClass();
        genericClass1.setT("a");

        // 1.类型实参放在 = 后面不生效
        GenericClass genericClass2 = new GenericClass<String>();
        genericClass2.setT(123);

        // 2.类型实参放在 = 前面生效
        GenericClass<String> genericClass3 = new GenericClass();
        // 这里会「直接」报错,类的泛型类型是在实例化的时候声明的，此处为String类型
//        genericClass3.setT(123);
        genericClass3.setT("a");


        // 类的泛型的上下边界需要在类声明的时候定义，即定义类型形参，实例化的时候定义无效
        GenericClass<? extends Number> genericClass4 = new GenericClass();
        // 此处会报错
//        genericClass4.setT(123L);

        // 此处会报错，String非Number子类,无效
//        GenericClassBound<String> genericClass5 = new GenericClassBound();


        GenericClassBound<Integer> genericClass6 = new GenericClassBound();
        genericClass6.setT(123);


        // 二.泛型接口demo
        GenericInterface genericInterface = new GenericInterfaceImpl();
        // 这里「编译」不会报错,实例化的时候定义无效
        genericInterface.setT(123L);
        genericInterface.setT("a");

        // 如果实现类GenericInterfaceImpl1不传类型实参，可以使用任意的类型
        GenericInterface genericInterface1 = new GenericInterfaceImpl1();
        genericInterface1.setT(123);

        // 接口泛型的上下边界需要在接口上定义，即定义类型形参，实例化的时候定义无效
        GenericInterfaceBound genericInterfaceImpl2 = new GenericInterfaceImpl2();
        genericInterfaceImpl2.setT(123);



        // 三.泛型方法demo
        GenericMethod genericMethod = new GenericMethod();
        genericMethod.genericMethod("a");

    }
}
